/*
 * PsRecordCaster.h
 *
 *  Created on: 2018年8月25日
 *      Author: zhengboyuan
 */

#ifndef PSRECORDCASTER_H_
#define PSRECORDCASTER_H_

#include "BasicType.h"
#include "MFormat.h"
#include "MStorageType.h"

namespace av
{

#define	MAX_CASTER_SCALE	16
#define	MIN_CASTER_SCALE    1.0/8


struct PsRecordCasterTransport
{
	int protocol;
	int outPort;
	int	payload;
	uint32_t ssrc;
	int esMode;				/// > 0 表示使用RTP传输ES流
};

enum PsRecordCasterEventType
{
	CASTER_EVENT_OPENING     = 0x0100,	/// 打开文件中
	CASTER_EVENT_OPEN_FAILED = 0x0100 + 1,		/// 打开失败
	CASTER_EVENT_OPENED  = 0x0100 + 2,			/// 打开成功
	CASTER_EVENT_CLOSED  = 0x0100 + 3,			/// 文件关闭
	CASTER_EVENT_END     = 0x0100 + 4,		/// 播放结束

	CASTER_EVENT_SEEKING = CASTER_EVENT_END + 2,	/// 拖拽中
	CASTER_EVENT_SEEKED,		/// 拖拽完成
	CASTER_EVENT_SCALE,

	CASTER_EVENT_PLAYING,		/// 播放中
	CASTER_EVENT_PAUSED,			/// 暂停
	CASTER_EVENT_STOPPED		/// 停止播放

};


class PsRecordCasterSink
{
public:
	virtual ~PsRecordCasterSink() {}

	virtual void onCasterEvent(int channel, int event) =0;
};


class  DLLEXPORT PsRecordCaster
{
public:
	static int init();

	static void quit();

	static PsRecordCaster& instance();

public:
	virtual ~PsRecordCaster() {}

	/**
	 * 打开录像库
	 * @param dbpath	数据库路径
	 * @return true 表示成功
	 */
	virtual bool open(const char* dbpath) =0;

	virtual void close() =0;

	virtual bool isOpen() =0;

	/**
	 * 设置事件回调
	 * @param sink
	 */
	virtual void setEventSink(PsRecordCasterSink* sink) =0;

	/**
	 * 查找录像
	 * @param query     查询条件
	 * @param records	录像数组
	 * @param size		数组大小
	 * @return	录像个数
	 */
	virtual int findRecord(const MRecordQuery& query, int offset, MRecord* records, int size) =0;

	/**
	 * 统计满足条件的记录数
	 * @param query
	 * @return 总数
	 */
	virtual int countRecord(const MRecordQuery& query) =0;

	/**
	 * 根据录像ID查询录像
	 * @param id    录像ID
	 * @param record    录像
	 * @return true 表示成功
	 */
	virtual bool getRecord(int id, av::MRecord& record) =0;

	/**
	 * 删除指定ID的录像
	 * @param id	录像ID
	 * @return true 表示成功
	 */
	virtual bool deleteRecord(int id) =0;


	/**
	 * 打开通道
	 * @param protocol	协议
	 * @param outPort   本地端口, 0 表示自动生成
	 * @param records   录像文件
	 * @param size		录像个数
	 * @param offset    播放偏移, 单位为毫秒
	 * @param scale     播放速度, 取值范围[1/8,16]
	 * @return 通道句柄, 0 表示失败
	 */
	virtual int openChannelFile(const PsRecordCasterTransport& transport, MRecord* records, int size, int64_t offset, double scale) =0;

	/**
	 * 打开通道
	 * @param protocol  协议
	 * @param outPort   本地端口
	 * @param device    设备标识
	 * @param fromTime  开始时间
	 * @param toTime    结束时间
	 * @param scale     播放速度
	 * @return
	 */
	virtual int openChannelTime(const PsRecordCasterTransport& transport, const char* device, long fromTime, long toTime, double scale) =0;

	/**
	 * 关闭通道
	 * @param channel 通道句柄
	 */
	virtual void closeChannel(int channel) =0;

	/**
	 * 添加发送目标地址
	 * @param channel
	 * @param ip        IP地址
	 * @param port      端口
	 * @return
	 */
	virtual bool addTarget(int channel, const char* ip, int port) =0;

	/**
	 * 删除发送目标地址
	 * @param channel    通道句柄
	 * @param ip        IP地址
	 * @param port      端口
	 * @return
	 */
	virtual bool removeTarget(int channel, const char* ip, int port) =0;

	/**
	 * 删除所有发送目标
	 * @param channel    通道句柄
	 * @return
	 */
	virtual void removeTargets(int channel) =0;

	/**
	 * 设置播放速度
	 * @param scale 播放速度, 取值范围[1/8,16]
	 * @return
	 */
	virtual bool setScale(int channel, double scale) =0;

	/**
	 * 拖拽定位
	 * @param offset    播放偏移, 单位为毫秒
	 * @return
	 */
	virtual bool seek(int channel, int64_t offset) =0;


	/**
	 * 开始
	 * @param channel
	 * @return
	 */
	virtual bool startCast(int channel) =0;

	/**
	 * 停止
	 * @param channel
	 */
	virtual void stopCast(int channel) =0;


	virtual void pauseCast(int channel) =0;

};




}

#endif /* PSRECORDCASTER_H_ */
